<div id="maincontent">

<h1>ECMAScript arguments 对象</h1>

<div id="tpn">

</div>


<div>
<h2>arguments 对象</h2>

<p>在函数代码中，使用特殊对象 arguments，开发者<em>无需明确指出参数名</em>，就能访问它们。</p>

<p>例如，在函数 sayHi() 中，第一个参数是 message。用 arguments[0] 也可以访问这个值，即第一个参数的值（第一个参数位于位置 0，第二个参数位于位置 1，依此类推）。</p>

<p>因此，无需明确命名参数，就可以重写函数：</p>

<pre>
function sayHi() {
  if (<code>arguments[0]</code> == &quot;bye&quot;) {
    return;
  }

  alert(arguments[0]);
}
</pre>
</div>


<div>
<h2>检测参数个数</h2>

<p>还可以用 arguments 对象检测函数的参数个数，引用属性 arguments.length 即可。</p>

<p>下面的代码将输出每次调用函数使用的参数个数：</p>

<pre>
function howManyArgs() {
  alert(arguments.length);
}

howManyArgs(&quot;string&quot;, 45);
howManyArgs();
howManyArgs(12);
</pre>

<p>上面这段代码将依次显示 &quot;2&quot;、&quot;0&quot; 和 &quot;1&quot;。</p>

<p class="note"><span>注释：</span>与其他程序设计语言不同，ECMAScript 不会验证传递给函数的参数个数是否等于函数定义的参数个数。开发者定义的函数都可以接受任意个数的参数（根据 Netscape 的文档，最多可接受 255 个），而不会引发任何错误。任何遗漏的参数都会以 undefined 传递给函数，多余的函数将忽略。</p>
</div>


<div>
<h2>模拟函数重载</h2>

<p>用 arguments 对象判断传递给函数的参数个数，即可模拟函数重载：</p>

<pre>
function doAdd() {
  if(arguments.length == 1) {
    alert(arguments[0] + 5);
  } else if(arguments.length == 2) {
    alert(arguments[0] + arguments[1]);
  }
}

doAdd(10);	<span>//输出 &quot;15&quot;</span>
doAdd(40, 20);	<span>//输出 &quot;60&quot;</span>
</pre>

<p>当只有一个参数时，doAdd() 函数给参数加 5。如果有两个参数，则会把两个参数相加，返回它们的和。所以，doAdd(10) 输出的是 &quot;15&quot;，而 doAdd(40, 20) 输出的是 &quot;60&quot;。</p>

<p>虽然不如重载那么好，不过已足以避开 ECMAScript 的这种限制。</p>
</div>


<div id="bpn">

</div>




</div>
